查看原文
其他

Halcon教程之基于形状的匹配(干货)

Mv_Chai 机器视觉课堂 2021-09-10


        基于形状的匹配不使用像素及其邻域的灰度值作为模板而是用轮廓的形状描述模型。本节主要讲述四个方面


基于形状的匹配的一个示例

如何从参考图像选择一个适当的 ROI派生模板图像

如何创建合适的模型

如何优化搜索


请注意, 对于基于形状的匹配, 可用HDevelop 助手进行配置和测试以获得最大匹配速度和识别率。

 

1 示例


在本节中, 我们给出了基于形状匹配的匹配过程的快速概述。实力为HDevelop 程序solution_guide\matching\first_example_shape_matching.hdev, 它定位打印在 IC 上图案。


步骤 1: 在参考图像中选择对象


抓取参考图像后, 第一个任务是创建包含该对象的区域。在示例程序中, 使用算子gen_rectangle1创建一个矩形区域。可以用交互式的方式绘制区域, 例如,draw_rectangle1或者使用以前的分割过程所产生的区域。然后, 使用算子reduce_domain创建一个仅包含选定区域 (即模板图像) 的图像。


Row1 := 188

Column1 := 182

Row2 := 298

Column2 := 412

gen_rectangle1 (ROI, Row1, Column1, Row2, Column2)

reduce_domain (ModelImage, ROI, ImageROI)


步骤 2: 创建模型


    使用算子create_shape_model创建模型。在创建模型之前, 我们建议应用算子inspect_shape_model, 该算子可以为模型创建找到合适的参数。


inspect_shape_model (ImageROI, ShapeModelImages, ShapeModelRegions, 8, 30) 

create_shape_model (ImageROI, NumLevels, 0, rad (360), ' auto ', ' no ',  ' use_polarity ', 30, 10, ModelID)

 

                1                                                      2

    (左) 参考图像的 ROI 指定对象;    (右) 内部模型 (4 个金字塔级别)。

        inspect_shape_model显示两个参数的效果, 特别是创建模型的金字塔级别数 (NumLevels) 和最小对比度。因此, 算子inspect_shape_model返回所选金字塔级别上的模型点。因此, 您可以检查模型是否包含相关信息来描述感兴趣的对象。


        当实际使用算子create_shape_model创建模型时, 除了NumLevels和对比度可以指定其他参数。例如, 可以限制对象可以承担的角度范围 (AngleStart和AngleExtent) 和创建模型的角度步长 (AngleStep)。参数Optimization可以减少模型点的数量, 这在模型非常大的情况下是有用的。参数Metric用于指定是否必须观察模型点的极性。最后,可以通过参数MinContrast指定最小对比度对象点必须在搜索图像中与模型进行对比度。

       

        如果不仅方向, 而且搜索对象的缩放比例也允许变化, 则必须使用算子create_scaled_shape_model或create_aniso_shape_model来创建模型。然后, 可以用类似于角度范围的参数来描述允许的比例范围。


步骤 3: 查找对象


        要在搜索图像中查找对象, 只需调用算子find_shape_model即可。对其中一个示例图像的结果进行了分析。

for i := 1 to 20 by 1

    grab_image (SearchImage, FGHandle)

    find_shape_model (SearchImage, ModelID, 0, rad(360), 0.7, 1, 0.5,     'least_squares', 0, 0.7, RowCheck, ColumnCheck, AngleCheck, Score)

endfor

        除已经被提及的ModelID,find_shape_model提供了进一步优化搜索过程的参数。参数AngleStart,AngleExtent和NumLevels在创建模型时已经指定, 允许在搜索过程中使用更严格的值通过使用NumLevels值为0, 则使用在创建模型时指定的值。参数MinScore可以指定如何模型的大部分必须是可见的。值0.5近似地意味着必须找到模型的轮廓的一半。此外, 还可以指定图像中预期对象的实例数量 (NumMatches) 和多少个实例的对象可能在图像中重叠 (MaxOverlap)。参数Greediness描述使用的启发式搜索,范围从 "安全但缓慢" (值0) "快速但不安全" (值1)。


        算子find_shape_model返回每个找到的对象实例的位置和方向在 "参数行,列和角度, 及其相应得分.

 

                                    在其他图像中查找对象。

        如果使用算子find_scaled_shape_model或find_aniso_shape_model(分别在创建模型时使用create_scaled_shape_model或create_aniso_shape_model), 可计算X方向比例或者Y方向比例。


步骤 4: 销毁模型


当不再需要形状模型时,使用clear_shape_model.将模型销毁。

Clear_shape_model (ModelID)


2 选择模型 ROI


        作为基于形状的匹配的第一步, 指定模板图像的感兴趣区域必须按照所描述的那样选择,可以创建一个仅包含对象 "健壮" 部分的 ROI。必须选择 ROI, 以便它包含对象的所有突出结构。为此, ROI 不应该太 "薄", 因为否则它在更高的金字塔等级消失。作为一个经验法则, 如果 ROI 最小为是2NumLevels−1像素宽。即8像素的宽度允许使用4个金字塔级别。


        在引用图像中使用基于形状的匹配时, 还可以使用算子inspect_shape_model通过额外的图像处理来改进交互式选择的 ROI。在例程solution_guide\matching\

process_shape_model.hdev中有详细说明。


步骤 1: 选择箭头


在该箭头周围不尝试排除杂波创建初始 ROI

 



 处理结果inspect_shape_model: a) 交互式 ROI;b) 不同价值的模型Contrast;c) 加工模型区域和相应的 ROI 和模型;d) 搜索结果。


gen_rectangle1 (ROI, 361, 131, 406, 171)

reduce_domain (ModelImage, ROI, ImageROI)


步骤 2: 创建初始模型区域


然后, 通过以下方式检查 ROI。


inspect_shape_model (ImageROI, ShapeModelImage, ShapeModelRegion, 1, 30)


b显示将为参数的不同对比值创建的形状模型区域。正图形显示, 不能删除杂波而不丢失箭头本身的特征点。


步骤 3: 处理模型区域


这个问题可以通过利用算子inspect_shape_model返回形状模型区域来解决。因此, 您可以像其他区域一样处理它。主要利用形态学算子opening_circle去除杂波消除干扰区域。在此之前,必须适应算子 fill_up填充箭头的内部部分, 因为只有边界点属于 (原) 模型区域。


fill_up (ShapeModelRegion, FilledModelRegion)

opening_circle (FilledModelRegion, ROI, 3.5)


步骤 4: 创建最终模型


然后, 将获得的区域用于创建匹配的模型, 以便成功查找所有箭头。图3.4c显示处理的区域、相应的感兴趣区域和最终模型区域。


create_shape_model (ImageROI, 3, 0, rad(360), 'auto', 'none', 'use_polarity', 30, 15, ModelID)


3 创建合适的形状模型


        从参考图像选择模板图像用来创建形状模型。请注意, 基于形状的匹配由不同的方法组成, 用于在图像中查找经过训练的对象。根据所选方法, 采用下列算子之一来创建模型:


create_shape_model为基于形状的简单匹配创建模型, 使用模板图像派生模型, 并且不支持缩放。

create_shape_model_xld为基于形状的简单匹配创建模型, 使用 XLD 轮廓派生模型, 并且不支持缩放。

create_scaled_shape_model为基于形状的匹配创建模型, 使用模板图像派生模型并支持统一缩放。

create_scaled_shape_model_xld为基于形状的匹配创建模型, 使用 XLD 轮廓派生模型, 并支持统一缩放。

create_aniso_shape_model为基于形状的匹配创建模型, 使用模板图像派生模型并支持各向异性缩放。

create_aniso_shape_model_xld为基于形状的匹配 t 创建模型hat 使用 XLD 轮廓来推导模型, 并支持各向异性缩放。


请注意, 如果从 XLD 轮廓派生模型, 则在第一次匹配之后, 强烈建议使用set_shape_model_metric确定模型的极性信息。


通过调整参数Contrast指定哪个像素是模型的一部分

通过调整参数NumLevels使用抽样加快搜索速度,

调整参数的方向范围AngleExtent,AngleStart和AngleStep

通过调整参数ScaleMin,ScaleMax和ScaleStep来允许特定范围的刻度或相应参数的各向同性缩放 

通过调整参数MinContrast指定在最小对比度


请注意, 在调整参数时,可以利用HALCON算子:

应用inspect_shape_model:

在创建模型之前, 可以应用运算符inspect_shape_model到模板图像以尝试不同的NumLevels参数值和对比度。算子返回具有多个金字塔级别的形状模型的结果表示形式, 从而允许您直观地检查该模型是否充分表示了感兴趣的对象。如果参数值的几个组合不能得到满意的结果, 可能是模板图像或模型的 ROI 未正确选择。


使用自动参数建议:

对于许多参数你可以让HALCON建议合适的参数。然后, 可以将create_shape_model相应的参数设置为’auto’在, 或应用determine_shape_model_params自动确定参数对于模板图像中的形状模型。请注意, 这两种方法只返回大约相同的值, 并且create_shape_model返回更精确的值。



3.1 指定像素这是模型的一部分 (对比度)


       当调用create_shape_model时通过对比度指定获得一个合适的模型对比应该选择在重要的特征像素滤除杂波。


        在某些情况下, 不可能找到一个单一的对比度值可以消除杂波而不移除对象的某些部分。下图显示一个示例。任务是为垫的轮廓创建模型。如果选择了完整的轮廓, 则模型还包含杂波 (图a).如果移除杂波, 则缺少部分轮廓 (b).

 


选择对比度: a) 包含杂波的完整对象;b) 小杂波但不完整的物体;c) 滞后阈值;d) 最小轮廓尺寸。


        为解决此问题, 参数Contrast提供了两种附加方法: 滞后阈值和基于尺寸的轮廓零件的选择。指定一个值的元组来使用这两个方法而不是单个值。

滞后阈值 (参见算子hysteresis_threshold) 使用两个阈值, 一个下限和一个上限。对于模型, 选择的第一个像素的对比度高于上限阈值。然后, 像素的对比度高于较低的阈值和连接添加到高对比度像素, 直接或通过另一像素与较低阈值的对比度。此方法使您可以选择对比度较低的轮廓部分。返回到的例子与垫: 你可以看到在c, 有一个滞后阈值, 你可以创建一个模型的完整垫轮廓。下面的代码行演示如何在元组中指定两个阈值:


inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 2, [40,70])


        第二种去除杂波的方法是为轮廓组件指定最小轮廓尺寸 (即像素数)。图d显示示例任务的结果。必须在元组的第三个元素中指定最小轮廓尺寸。如果不希望另外使用滞后阈值, 必须将前两个元素设置为相同的值:


inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 2, [40,40,30])


 请注意, 您可以让HALCON选择合适的值本身通过指定对比对参数为‘auto’。


3.2 使用抽样和减少点加快搜索速度 (NumLevels)


        为了加快匹配过程, 可以使用抽样方法。 由原始的、全尺寸的图像和一组缩减像素取样图像组成一个图像金字塔。然后在上创建并搜索模型在不同的金字塔等级。

        可以指定通过参数使用的金字塔级别数NumLevels。建议选择最高的金字塔级别, 模型至少包含10-15 像素, 并且模型的形状仍然类似于对象形状。


  一个简单得多的方法是让HALCON选择合适的值通过指定NumLevels为’auto’.然后, 您可以通过算子get_shape_model_params查询所使用的值。


3.3.3.3 允许方向范围 (AngleExtent,AngleStart,AngleStep)


        如果对象的旋转可能在搜索图像中有所不同, 则可以在参数中指定允许的范围AngleExtent和起始角AngleStart(单位: 弧度)。请注意, 旋转的范围是相对于参考图像定义的, 即, 一个起始角度0对应于对象在参考图像中的方向。


        请注意, 在调用算子find_shape_model时可以进一步限制允许的范围。因此, 如果要对需要不同角度范围的不同任务重用模型, 则可以在创建模型和搜索范围较小时使用大范围。


        如果对象是 (几乎) 对称的则应该限制允许的范围。否则, 搜索过程将在同一对象上以不同的角度找到多个几乎相同的匹配项。哪个匹配 (在哪个角度) 被返回作为最佳可以跳跃从图片到图象。适用的旋转范围取决于对称性: 对于十字形或方形物体, 允许的范围必须小于90◦, 对于小于180的矩形对象◦, 对于圆形对象0◦。


         大范围的旋转也会导致高内存需求。因此, 在这种特殊情况下, 建议尽可能限制在创建模型期间已经允许的旋转范围, 以加快搜索速度。


        在匹配过程中, 在允许范围内的不同角度搜索模型, 并在参数AngleStep指定步长.如果选择该值’auto’, HALCON通过确定图像中仍然可见的最小旋转自动选择最佳步长φ选择, 可以达到尽可能高的精度。

 

旋转对称对象的适当角度范围。

  

请注意, 选择一个非常小的步骤大小不会导致增加角度精度!


3.4 允许规模范围 ((Scale*Min, Scale*Max, Scale*Step)


        与方向范围类似, 您可以指定允许的比例范围。可以允许以两种形式进行缩放:

行和列方向相同的缩放 (统一缩放)

行和列方向的不同缩放 (各向异性缩放)


请注意, 选择一个非常小的步长大小不会导致增加的规模精度!


3.5 指定与模型比较的像素 ((MinContrast, Metric)


        为提高搜索模型的效率。您可以指定参数MinContrast搜索图像中某个点必须至少具有的对比度, 以便与模型进行比较。此参数的主要用途是从匹配过程中排除噪声, 即灰色值波动。


        可以让HALCON选择合适的值本身通过指定MinContrast为‘auto’。


        该参数度量让可指定极性, 即对比度的方向是否和如何被检测到。如果选择值' use_polarity '观察到极性, 即搜索图像中的点必须显示与模型中相应点的对比方向。模型是一个明亮的对象在黑暗背景下, 只有当它比背景更亮时, 才会在搜索图像中找到该对象。

        通过选择值, 您可以选择忽略全局极性' ignore_global_polarity '。在这种模式下, 如果对象的对比度反转也会被识别, 例如, 如果对象在光背景下既可以显示为深色形状。然而, 这种灵活性是以降低速度为代价。


        如果选择该值' ignore_local_polarity ', 即使对比度在背景中更改, 也会找到该对象。此模式很有用, 例如, 如果对象由具有中等灰度值的部件组成, 则在其中深色或更亮的区域。

        但是请注意, 在这种模式下, 识别速度和鲁棒性可能会显著降低, 特别是如果您允许进行大范围的旋转 。

如何指定模板的极性


   

        如果您创建了XLD 轮廓模型, 没有关于可用模型极性的信息。因此, 在创建模型时, Metric必须设置为' ignore_local_polarity '。


3.6 检查和修改形状模型


        如果要直观地检查已创建的形状模型, 可以使用get_shape_model_contours获取表示模型在特定的 XLD 的轮廓。请注意, 模型的 XLD 轮廓位于图像的原点, 因此可能需要进行适当的可视化转换。


        使用算子get_shape_model_params检查模型的当前参数值。

        保存到文件时使用write_shape_model。

        读取模型文件使用read_shape_mode。


        在创建模型之后, 在搜索图像中搜索对象之前, 可以进一步修改模型。可以使用set_shape_model_param更改单个参数和set_shape_model_origin更改模型的原点。

        请注意, 通过修改参照点, 估计位置的精度可能会降低,因此如果可能, 引用点不应更改。


4 优化搜索过程


实际匹配由下列运算符之一执行:


find_shape_model搜索单个模型的实例, 如果模型的实例可能不随比例变化, 则使用

find_shape_models同时搜索多个模型的实例, 如果模型的实例可能不随比例变化, 则使用

find_scaled_shape_model搜索单个模型的实例, 如果允许统一缩放, 则使用

find_scaled_shape_models同时搜索多个模型的实例, 如果允许统一缩放, 则使用

find_aniso_shape_model搜索单个模型的实例, 如果允许行和列方向的不同缩放比例因子, 则使用

find_aniso_shape_models同时搜索多个模型的实例, 如果行中的不同缩放因子, 则使用和列方向是允许的。


在下面, 我们展示了如何为这些算子选择合适的参数来适应和优化匹配任务。


将搜索空间限制到感兴趣的区域

通过参数限制方向和缩放范围来限制搜索空间AngleStart,AngleExtent,ScaleMin和ScaleMax或对应的各向异性缩放参数

将搜索空间限制为对象的允许闭塞的特定数量, 即通过参数指定对象的可见性MinScore

通过调整参数Greediness, 指定使用的搜索启发式

通过调整参数NumMatches和MaxOverlap来搜索模型的多个实例 

通过调整参数ModelIDs同时搜索多个模型

通过调整参数subpixel指定结果所需的精度

限制金字塔级别的数量 (NumLevels) 优化搜索过程


请注意, 许多匹配方法只能用于在图像中搜索单个模型的单个实例, 而基于形状的匹配还可用于同时搜索多个模型的几个实例。


create_scaled_shape_model (ImageROIRing, 'auto', -rad(22.5), rad(45), 'auto', 0.8, 1.2, 'auto', 'none', 'use_polarity', 60, 10, ModelIDRing)

 create_scaled_shape_model (ImageROINut, 'auto', -rad(30), rad(60), 'auto', 0.6, 1.4, 'auto', 'none', 'use_polarity', 60, 10, ModelIDNut)

 ModelIDs := [ModelIDRing,ModelIDNut]

更多关于模板匹配的文章请参考:

Halcon教程之模板匹配(一)

Halcon教程之模板匹配输出结果总结


长按下方二维码识别免费关注


: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存